#include "StdAfx.h"
#include "FitxerGeneric.h"
#include "io.h"

CFitxerGeneric::CFitxerGeneric(void){

	Construeix(0);
}

CFitxerGeneric::~CFitxerGeneric(void)
{
	if(m_obert){
		Tancar();
		//no possem el m_obert=false; per que el constructor sols el cridem un cop. 
	}
}

void CFitxerGeneric::Construeix(long tamanyregistre){
		
	m_obert=false;
	m_registres=0;
	m_tamanyregistres=tamanyregistre;
	m_fitxer=NULL;
	m_nomFitxer[0]=0;

}

CFitxerGeneric::CFitxerGeneric(long tamanyregistre){

	Construeix(tamanyregistre);

}
bool CFitxerGeneric::Obrir(const char *nomfitxer){

	bool ret=false;
	if(!m_obert){
		if(_access(nomfitxer,0x00)!=0x00){
			m_fitxer=fopen(nomfitxer,"a+");
			if(m_fitxer){
				fclose(m_fitxer);
			}
		}
		m_fitxer=fopen(nomfitxer,"r+b");
	
		if(m_fitxer!=NULL){
			m_obert=true;
			strcpy(m_nomFitxer,nomfitxer);
			fseek(m_fitxer,0,SEEK_END);
			long l=ftell(m_fitxer);
			m_registres=l/(m_tamanyregistres+sizeof(bool));//retorna quants bytes te un camp boolea.
		}
		ret=true;
	}
	return ret;

}

bool CFitxerGeneric::Tancar(){

	bool ret=false;
	if(m_obert){
		fclose(m_fitxer);
		m_registres=0;
		m_nomFitxer[0]=0;
		m_fitxer=NULL;
		m_obert=false;
		ret=true;
	}
	return ret;
}


bool CFitxerGeneric::Escriure(const void *registre, long index){	

	bool ret=false;
	if(m_obert){
		if((index>=0)&&(registre!=NULL)){
			fseek(m_fitxer,index*(m_tamanyregistres+sizeof(bool)),SEEK_SET);			
			//com fer camp de control
			bool ocupat=true;
			if(fwrite((void*)&ocupat,sizeof(bool),1,m_fitxer)==1){
				if(fwrite(registre,m_tamanyregistres,1,m_fitxer)==1){
					ret=true;
					while(index>m_registres){
						fseek(m_fitxer,m_registres*(m_tamanyregistres+sizeof(bool)),SEEK_SET);
						ocupat=false;
						fwrite((void*)&ocupat,sizeof(bool),1,m_fitxer);
							m_registres++;
					}
					if(index==m_registres){
						m_registres++;
						
					}
				}

			}

		}

	}
	return ret;

}

bool CFitxerGeneric::Llegir(void *registre, long index) const{

	bool ret=false;
	if(m_obert){
		if((index>=0)&&(registre!=NULL)){
			fseek(m_fitxer,index*(m_tamanyregistres+sizeof(bool)),SEEK_SET);
			bool ocupat=false;
			if(fread((void*)&ocupat,sizeof(bool),1,m_fitxer)==1){
				if(ocupat){
					ret=(fread(registre,m_tamanyregistres,1,m_fitxer)==1);
				}
			}
		}
	}
	return ret;
}

bool CFitxerGeneric::Esborrar(long index){

	bool ret=false;

	if(m_obert){
		if((index>=0)&&(index<m_registres)){
			fseek(m_fitxer,index*(m_tamanyregistres+sizeof(bool)),SEEK_SET);
			bool ocupat=false;
			if(fread((void*)&ocupat,sizeof(bool),1,m_fitxer)==1){
				if(ocupat){
					fseek(m_fitxer,index*(m_tamanyregistres+sizeof(bool)),SEEK_SET);
					ocupat=false;
					ret=(fwrite((void*)&ocupat,sizeof(bool),1,m_fitxer)==1);
										
				}
			}
		}
	}
	return ret;
}

